/**
TypeScript（TS）是 JavaScript 的一个超集，增加了静态类型检查。TypeScript 提供了一些基本数据类型，帮助开发者更好地定义和管理变量的类型。
  1. 基本数据类型
  - Boolean：表示逻辑值，只有两个可能的值： true  和  false 。
    let isActive: boolean = true;

  - Number：表示数字，包括整数和浮点数。TypeScript 中的数字类型与 JavaScript 相同。
    let age: number = 30;
    let price: number = 19.99;

  - String：表示文本数据，可以使用单引号、双引号或反引号（模板字符串）。
    let name: string = "Alice";
    let greeting: string = Hello, ${name};

  - Array：表示数组，可以包含多种类型的数据。可以使用泛型（如  Array<Type> ）或简写（如  Type[] ）来定义数组类型。
    let numbers: number[] = [1, 2, 3];
    let fruits: Array<string> = ["apple", "banana", "orange"];
    
  - Tuple：表示一个固定长度和已知类型的数组。每个元素可以是不同的类型。
    let person: [string, number] = ["Alice", 30];

  - Enum：表示枚举类型，允许开发者定义一组命名的常量，方便管理和使用。
    enum Color {
      Red,
      Green,
      Blue
    }
    let c: Color = Color.Green;

  - Any：表示任意类型，允许变量可以是任何类型。通常在不确定变量类型时使用，但应谨慎使用，以避免失去类型安全。
    let randomValue: any = 10;
    randomValue = "Now I'm a string";

  - Void：表示没有任何类型，通常用于函数没有返回值的情况。
    function logMessage(message: string): void {
      console.log(message);
    }

  - Null 和 Undefined：分别表示空值和未定义的值。TypeScript 中可以将这两种类型赋值给其他类型，具体取决于配置。
    let u: undefined = undefined;
    let n: null = null;

  2. 总结
  TypeScript 提供了多种基本数据类型，包括  boolean 、 number 、 string 、 array 、 tuple 、 enum 、 any 、 void 、 null  和  undefined 。这些数据类型帮助开发者在编写代码时更好地定义变量的类型，提高了代码的可读性和可维护性，同时也增强了类型安全性。通过合理使用这些基本数据类型，可以有效减少运行时错误，提升开发效率。
 */

  // 1. Array
  let names: string[] = ["Alice", "Bob", "Charlie"];
  names.push("Dave")

  let nums: Array<number> = [1, 2, 3];

  // 2. Object
  let person: { name: string; age: number } = {
    name: "Alice",
    age: 30
  }
  person.age = 31
  console.log("2. Object", person);

  // 3. 参数类型: 在定义一个TypeScript中的函数时, 都要明确的指定参数的类型
  function sum(num1: number, num2: number): number {
    return num1 + num2
  }
  const result = sum(10, 20)

  // 4. 函数返回值类型
  function sayHello(): void {
    console.log("Hello, World!");
  }

  // 5. 匿名函数的类型
  // 匿名函数是否需要添加类型注解呢? 最好不要添加类型注解
  names.forEach((item, index, arr) => {
    console.log("5. 匿名函数的类型", item, index, arr)
  })

  // 6. 对象类型的使用
  type PointType = {
    x: number;
    y: number;
    z?: number;
  }

  function printCoordinate(point: PointType) {
    console.log("6. 对象类型的使用", point.x, point.y)
  }
  printCoordinate({ x: 10, y: 20})

  // 7. 函数类型的练习
  type LyricType = {
    time: number;
    text: string;
  }

  // 歌词解析工具
  function parseLyric(lyric: string): LyricType[] {
    const lyrics: LyricType[] = []
    lyrics.push({ time: 1111, text: "parsed lyric" })
    return lyrics
  }

  const lyricInfos = parseLyric("person: [00:00.000] hello\n[00:01.000] world")
  for (const item of lyricInfos) {
    console.log(item.time, item.text)
  }

  export {}